﻿// See https://aka.ms/new-console-template for more information
var cts = new CancellationTokenSource();

var task = DoSomething(cts.Token);

cts.Cancel();
//调用 cts.Cancel() 只是向 CancellationToken 发出取消请求，但任务是否实际取消取决于任务内部是否响应了这个请求。

try
{
    await task;
    Console.WriteLine("方法执行成功");
}
catch (OperationCanceledException)
{
    Console.WriteLine("异步任务中断");
}

Console.WriteLine("Hello, World!");


//仅调用 cts.Cancel() 并不会自动取消正在执行的任务，任务内部需要显式检查 CancellationToken 的状态。
//使用 cancellationToken.ThrowIfCancellationRequested() 方法可以显式检查取消请求，并在检测到取消时抛出异常。
//在异步等待时，应该将 CancellationToken 传递给异步方法，以便在等待期间能够响应取消请求。
async Task<bool> DoSomething(CancellationToken cancellationToken = default)
{
    // 检查取消请求
    cancellationToken.ThrowIfCancellationRequested();

    // 模拟异步操作并传递 CancellationToken
    await Task.Delay(2000, cancellationToken); // 模拟异步操作时
    //在调用 Task.Delay 时，将 CancellationToken 传递给它，这样在等待期间如果收到取消请求，Task.Delay 会抛出 OperationCanceledException 异常。

    // 再次检查取消请求
    cancellationToken.ThrowIfCancellationRequested();
    return true;
}